package solution.liuyu2783.offer;

/**
 * 剑指 Offer 12. 矩阵中的路径
 * 请设计一个函数，用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始，每一步可以在矩阵中向左、右、上、下移动一格。
 * 	如果一条路径经过了矩阵的某一格，那么该路径不能再次进入该格子。例如，在下面的3×4的矩阵中包含一条字符串“bfce”的路径（路径中的字母用加粗标出）。
	
	[["a","b","c","e"],
	["s","f","c","s"],
	["a","d","e","e"]]
	
	但矩阵中不包含字符串“abfb”的路径，因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后，路径不能再次进入这个格子。

 *
 */
public class Q12_FindPath_M {

	/**
	 * 思路：DFS（深度优先遍历）
	 * 1、判空
	   2、循环遍历数组board，依次将遍历到的元素进行dfs递归搜索，只要有一次匹配成功，则直接返回true，否则遍历结束返回false
	   3、递归终止条件：当前遍历的元素越界，或者当前元素不等于word的第k个元素，此时匹配失败，返回false，否则表示当前元素匹配成功，
	   		如果此时k等于word的长度减1，表示匹配成功，此时直接返回true
	   4、取出当前元素赋值给变量c，然后将数组中当前位置置为'/'(如果本身是'/'，则设置成'-'，用来表示当前字符已经访问过)，然后将k加1，
	   	进行下一层递归（可以向左，向右，向上，向下四个方向，只要有一个为匹配成功，就表示匹配成功，返回true，否则返回false），
	   	然后将当前位置元素赋值为其替换前的原始元素（变量c中存储）

	 */
	public static void main(String[] args) {
		char[][] board = new char[3][4];
//		char[] r1 = new char[] {'a','b','c','e'};
//		char[] r2 = new char[] {'s','f','c','s'};
//		char[] r3 = new char[] {'a','d','e','e'};
		char[] r1 = new char[] {'c','a','a'};
		char[] r2 = new char[] {'a','a','a'};
		char[] r3 = new char[] {'b','c','d'};
		board[0] = r1;
		board[1] = r2;
		board[2] = r3;
//		String word = "bfce";
		String word = "aab";
		System.out.println(Q12_FindPath_M.exist(board, word));
	}
	
	
	public static boolean exist(char[][] board, String word) {
		if(word == null || board ==null) {
			return false;
		}
		for (int i = 0; i < board.length; i ++) {
            for (int j = 0; j < board[0].length; j ++) {
                if (dfs(board, word, i, j, 0)) {
                    return true;
                }
            }
        }
		return false;
	}
	
	public static boolean dfs(char[][] board, String word, int row, int col, int k) {
		int rows = board.length;
        int cols = board[0].length;
        if (row < 0 || row >= rows || col < 0 || col >= cols //越界处理
        		|| word.charAt(k) != board[row][col]) {//单词不在数组中
            return false;
        }
        char c = board[row][col];
        System.out.println("["+row+"]"+"["+col+"] = "+ c);
        if (k == word.length() - 1) { //全部找到
            return true;
        }        
        char flag = c == '/' ? '-' : '/';
        board[row][col] = flag;
        k ++;
        //可以向左，向右，向上，向下四个方向
        boolean result = dfs(board, word, row,col -1, k) ||
        			dfs(board, word, row,col +1, k) ||
        			dfs(board, word, row -1 ,col, k) ||
        			dfs(board, word, row + 1,col, k);
        board[row][col] = c;
		return result;
	}
}
